home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1996-02-01 | 38.0 KB | 828 lines | [TEXT/.Ob4] |
- Syntax10.Scn.Fnt
- StampElems
- Alloc
- 1 Feb 96
- Syntax10b.Scn.Fnt
- Syntax10i.Scn.Fnt
- Times10.Scn.Fnt
- MODULE Macintosh; (* mf 24.9.93*) (* mah
- IMPORT
- SYS := SYSTEM, Sys, Kernel;
- CONST
- noMenu = 0;
- LineLen = 512;
- KeyBufLen = 127;
- blackColor = 33; whiteColor = 30;
- RealVector*=ARRAY 20 OF REAL;
- FontMapPtr* = LONGINT; (* Should be POINTER TO FontMap except for GC *)
- FontMapRealPtr* = POINTER TO FontMap;
- FontMap* = RECORD
- fCode: LONGINT; (*fntNum, fntSize, ordCh, y*2+1*)
- width*: ARRAY 256 OF INTEGER;
- height*, widMax*, ascent*, ndescent*, fntNum, fntSize, fntFace: INTEGER
- END;
- PatMapPtr = POINTER TO PatMap;
- PatMap = RECORD (Sys.BitMap)
- pattern: Sys.Pattern;
- link: PatMapPtr
- END;
- Longword = ARRAY 4 OF CHAR;
- CharPattern = ARRAY 4 OF CHAR;
- MenuEventMsg = RECORD id, item: INTEGER END;
- KeyEventMsg = RECORD rsvd, adr, virtual, ascii: CHAR END;
- syntaxFnt*, helveticFnt*: INTEGER;
- thePortClip*, userClip*: Sys.RgnHandle;
- thePortW*, thePortH*, shadowH*: INTEGER;
- thePortPtr*: Sys.WindowPtr;
- shadowPortPtr*: Sys.GrafPtr;
- neutralizeQ*, restoreQ*, suspendQ*, resumeQ*, backgroundQ*, cmdQ*: Kernel.Queue;
- macEvent*: BOOLEAN;
- cmdName*: ARRAY 32 OF CHAR;
- qRes*: INTEGER;
- convertClip*: BOOLEAN;
- nofch*, nextch*: INTEGER; keybuf*: ARRAY KeyBufLen+1 OF CHAR;
- prQD*: BOOLEAN;
- prOpen*: PROCEDURE(VAR name, user: ARRAY OF CHAR; password: LONGINT);
- prClose*: PROCEDURE;
- prPage*: PROCEDURE(nofcopies: INTEGER);
- prCircle*: PROCEDURE(x0, y0, r: INTEGER);
- prEllipse*: PROCEDURE(x0, y0, a, b: INTEGER);
- prLine*: PROCEDURE(x0, y0, x1, y1: INTEGER);
- prSpline*: PROCEDURE(x0, y0, n, open: INTEGER; VAR X, Y: ARRAY OF INTEGER);
- prPicture*: PROCEDURE(x, y, w, h, mode: INTEGER; adr: LONGINT);
- prUseListFont*: PROCEDURE(VAR name: ARRAY OF CHAR);
- prReplConst*: PROCEDURE(x, y, w, h: INTEGER);
- prReplPattern*: PROCEDURE(x, y, w, h, col: INTEGER);
- prString*: PROCEDURE(x, y: INTEGER; VAR s, fname: ARRAY OF CHAR);
- prContString*: PROCEDURE(VAR s, fname: ARRAY OF CHAR);
- prGetMetrics*: PROCEDURE(VAR fname: ARRAY OF CHAR; VAR fdx: ARRAY OF SHORTINT; VAR found: BOOLEAN);
- QD: RECORD (*QD Globals*)
- privates: ARRAY 41 OF INTEGER;
- screenBits: Sys.BitMap; arrow: Sys.Cursor;
- dkGray, ltGray, gray, black, white: Sys.Pattern;
- thePort: Sys.GrafPtr
- END;
- thePort: Sys.WindowPort; (* GrafPort of Oberon Display Window *)
- shadowPort: Sys.GrafPort; (* GrafPort of Oberon Shadow Bitmap *)
- line: ARRAY LineLen OF CHAR; llen: INTEGER; lineBuf: LONGINT; (* Line Cache *)
- lcf: FontMapPtr; lcx0, lcx, lcy, lcc, lco: INTEGER; lck: LONGINT; lcm: BOOLEAN; (* Line Cache *)
- ccp: CharPattern; ccf: FontMapPtr; ccdx: INTEGER; (* Character Cache *)
- tpf: FontMapPtr; tpc: INTEGER; (* Primary Port *)
- spf: FontMapPtr; spc: INTEGER; (* Secondary Port *)
- ppf: FontMapPtr; (* Printer Port *)
- inverse*, keytrans: ARRAY 256 OF CHAR; (* Bit Flipping and Key Translation *)
- xlim, ylim: INTEGER; grafArea: Sys.Rect; (* Bounds for Mouse and for DragWindow *)
- obnArrow: Sys.Cursor; obnMenus: Sys.MBarHnd; (* Oberon Mouse Pointer / Oberon Menu List *)
- patMaps: PatMapPtr; (* Linked List, Prevent Garbage Collection *)
- scrap: Sys.TEHandle; style: Sys.TEStyleHandle; text, textHandle: LONGINT; pos, max: INTEGER; (* Clipboard support *)
- osyntaxFnt: INTEGER; defaultFontName: ARRAY 32 OF CHAR; (*Font Translation*)
- redP, greenP, blueP: ARRAY 256 OF INTEGER; shadowColor: ARRAY 16 OF LONGINT;
- vblTask : Sys.VBLTask; (* variables for keyboard interrupt *)
- suspended: BOOLEAN;
- kbdIntPC*, kbdIntInstr*: LONGINT; (* position and old value of patched code *)
- p : PROCEDURE (t: LONGINT); (* procedure variable vor registration of VBL interrupt *)
- pressed: BOOLEAN; (* set if breakkey was pressed. Avoid cascades of break windows *)
- Gestalt: PROCEDURE (sel: LONGINT; VAR response: LONGINT): LONGINT;
- RGBForeColor: PROCEDURE (rgb: Sys.RGBColor);
- trueColor: BOOLEAN;
- pc1, pc2: LONGINT;
- bitmapSyntax: BOOLEAN;
- (*xxtop, xxleft, xxX, xxY: INTEGER; (*left margin of current line*)
- PROCEDURE SetXY (x, y: INTEGER);
- BEGIN
- xxleft := x; xxtop := y; xxX := xxleft; xxY := xxtop
- END SetXY;
- PROCEDURE Ch (ch: CHAR);
- VAR w: INTEGER;
- BEGIN
- w := Sys.CharWidth(ORD(ch));
- Sys.MoveTo(xxX, xxY);
- Sys.DrawChar(ORD(ch));
- INC(xxX, w)
- END Ch;
- PROCEDURE NL;
- BEGIN
- xxY := xxY + 12; xxX := xxleft;
- END NL;
- PROCEDURE Str (s: ARRAY OF CHAR);
- VAR i: INTEGER;
- BEGIN
- i := 0; WHILE s[i] # 0X DO Ch(s[i]); INC(i) END
- END Str;
- PROCEDURE Int (n: LONGINT);
- VAR d: ARRAY 10 OF CHAR; i: INTEGER;
- BEGIN
- IF n < 0 THEN Ch("-"); n := -n END;
- i := 0; REPEAT d[i] := CHR(30H + n MOD 10); n := n DIV 10; INC(i) UNTIL n = 0;
- REPEAT DEC(i); Ch(d[i]) UNTIL i = 0
- END Int;
- (* Pascal Strings *)
- PROCEDURE SetStr255* (VAR theStr255: Sys.Str255; chars: ARRAY OF CHAR);
- VAR i: INTEGER; ch: CHAR;
- BEGIN i := 0; REPEAT ch := chars[i]; INC(i); theStr255[i] := ch UNTIL (ch = 0X) OR (i=256);
- theStr255[0] := CHR(i-1)
- END SetStr255;
- PROCEDURE GetStr255* (VAR theStr255: Sys.Str255; VAR chars: ARRAY OF CHAR);
- VAR n: INTEGER; ch: CHAR;
- BEGIN n := ORD(theStr255[0]); IF LEN(chars) < n THEN n := SHORT(LEN(chars)) END;
- chars[n] := 0X; WHILE n > 0 DO ch := theStr255[n]; DEC(n); chars[n] := ch END
- END GetStr255;
- (* Display Window *)
- PROCEDURE UpdateOberonWindow*;
- BEGIN
- IF thePort.visible THEN Sys.SetPort(thePort);
- neutralizeQ.Handle(); Sys.BeginUpdate(thePort); restoreQ.Handle(); Sys.EndUpdate(thePort)
- END
- END UpdateOberonWindow;
- PROCEDURE ShowOberonWindow*;
- BEGIN Sys.ShowWindow(thePort); Sys.SelectWindow(thePort)
- END ShowOberonWindow;
- PROCEDURE HideOberonWindow*;
- BEGIN Sys.HideWindow(thePort)
- END HideOberonWindow;
- PROCEDURE FlushCache*;
- VAR fnt : FontMapRealPtr; rgb: Sys.RGBColor;
- BEGIN
- IF llen > 0 THEN
- fnt:=SYS.VAL (FontMapRealPtr, lcf);
- IF lcm THEN
- IF SYS.VAL (LONGINT, QD.thePort) # SYS.VAL (LONGINT, thePortPtr) THEN Sys.SetPort(thePort) END;
- IF thePort.clipRgn # lck THEN Sys.SetClip(lck) END;
- IF tpc # lcc THEN
- IF trueColor THEN
- rgb.red := redP[lcc]*101H;
- rgb.green := greenP[lcc]*101H;
- rgb.blue := blueP[lcc]*101H;
- RGBForeColor (rgb)
- ELSE
- Sys.PmForeColor(lcc+2)
- END;
- tpc := lcc
- END;
- IF thePort.txMode # lco THEN Sys.TextMode(lco) END;
- IF tpf # lcf THEN Sys.TextFont(fnt.fntNum); Sys.TextFace(fnt.fntFace); Sys.TextSize(fnt.fntSize); tpf := lcf END
- ELSE
- IF QD.thePort # shadowPortPtr THEN Sys.SetPort(shadowPort) END;
- IF shadowPort.clipRgn # lck THEN Sys.SetClip(lck) END;
- IF spc # lcc THEN Sys.ForeColor(shadowColor[lcc]); spc := lcc END;
- IF shadowPort.txMode # lco THEN Sys.TextMode(lco) END;
- IF spf # lcf THEN Sys.TextFont(fnt.fntNum); Sys.TextFace(fnt.fntFace); Sys.TextSize(fnt.fntSize); spf := lcf END
- END;
- Sys.MoveTo(lcx0, lcy+fnt.ndescent); Sys.DrawText(lineBuf, 0, llen); llen := 0
- END
- END FlushCache;
- PROCEDURE SetPenPort* (port: Sys.GrafPtr);
- VAR p: Sys.GrafRealPtr;
- BEGIN FlushCache;
- p := SYS.VAL (Sys.GrafRealPtr, port);
- Sys.SetPort(p^); ppf := 0
- END SetPenPort;
- PROCEDURE SetPenPic* (port: Sys.GrafPtr; black: BOOLEAN; mode: INTEGER);
- VAR p: Sys.GrafRealPtr;
- BEGIN FlushCache; ppf := 0; p := SYS.VAL (Sys.GrafRealPtr, port);
- IF QD.thePort # port THEN Sys.SetPort(p^) END;
- IF black THEN Sys.ForeColor(whiteColor) ELSE Sys.ForeColor(blackColor) END;
- IF p.pnMode # mode THEN Sys.PenMode(mode) END
- END SetPenPic;
- PROCEDURE SetPenScreen* (main: BOOLEAN; clip: Sys.RgnHandle; col, mode: INTEGER);
- VAR rgb: Sys.RGBColor;
- BEGIN
- FlushCache;
- IF main THEN
- IF SYS.VAL (LONGINT, QD.thePort) # SYS.VAL (LONGINT, thePortPtr) THEN Sys.SetPort(thePort) END;
- IF thePort.clipRgn # clip THEN Sys.SetClip(clip) END;
- IF tpc # col THEN
- IF trueColor THEN
- rgb.red := redP[col]*101H;
- rgb.green := greenP[col]*101H;
- rgb.blue := blueP[col]*101H;
- RGBForeColor (rgb)
- ELSE
- Sys.PmForeColor(col+2)
- END;
- tpc := col
- END;
- IF thePort.pnMode # mode THEN Sys.PenMode(mode) END
- ELSE
- IF QD.thePort # shadowPortPtr THEN Sys.SetPort(shadowPort) END;
- IF shadowPort.clipRgn # clip THEN Sys.SetClip(clip) END;
- IF spc # col THEN Sys.ForeColor(shadowColor[col]); spc := col END;
- IF shadowPort.pnMode # mode THEN Sys.PenMode(mode) END
- END
- END SetPenScreen;
- PROCEDURE CopyPattern* (pat: LONGINT; x, y: INTEGER);
- VAR p: Sys.BitMapRealPtr; r: Sys.Rect; port: Sys.GrafRealPtr;
- BEGIN
- port := SYS.VAL (Sys.GrafRealPtr, QD.thePort);
- IF ODD(pat) THEN
- IF port.txMode # port.pnMode THEN Sys.TextMode(port.pnMode) END;
- Sys.TextFont(SHORT((pat DIV 1000000H) MOD 100H));
- Sys.TextFace(SHORT((pat DIV 2) MOD 4));
- Sys.TextSize(SHORT((pat DIV 10000H) MOD 100H));
- tpf := 0; spf := 0;
- Sys.MoveTo(x, y+(SHORT(SHORT(pat)) DIV 8));
- Sys.DrawChar(SHORT((pat DIV 100H) MOD 100H))
- ELSIF pat # 0 THEN
- p := SYS.VAL(Sys.BitMapRealPtr, pat);
- r.bottom := y; r.left := x; r.top := r.bottom-p.bounds.bottom; r.right := r.left+p.bounds.right;
- Sys.PenPat(QD.black);
- Sys.CopyBits(p^, port.portBits, p.bounds, r, port.pnMode, 0)
- END
- END CopyPattern;
- PROCEDURE CopyPatternScreen* (main: BOOLEAN; clip: Sys.RgnHandle; col: INTEGER; pat: LONGINT; x, y, mode: INTEGER);
- BEGIN
- IF pat = SYS.VAL(LONGINT, ccp) THEN
- IF (x = lcx) & (y = lcy) & (ccf = lcf) & (col = lcc) & (mode = lco)
- & (llen # 0) & (llen # LineLen) & (clip=lck) & (main=lcm) THEN
- line[llen] := ccp[2]; INC(llen); INC(lcx, ccdx); RETURN
- ELSE
- FlushCache;
- line[0] := ccp[2]; llen := 1;
- lcx0 := x; lcx := lcx0+ccdx; lcy := y; lcf := ccf; lcc := col; lco := mode; lck := clip; lcm := main;
- RETURN
- END
- ELSE SetPenScreen(main, clip, col, mode); CopyPattern(pat, x, y)
- END
- END CopyPatternScreen;
- PROCEDURE CopyBlock* (sP, dP: Sys.GrafPtr; sx, sy, sw, sh, dx, dy, dw, dh: INTEGER);
- VAR sr, dr: Sys.Rect;sPr, dPr, port : Sys.GrafRealPtr;
- BEGIN
- sr.bottom := sy; sr.left := sx; sr.top := sr.bottom-sh; sr.right := sr.left+sw;
- dr.bottom := dy; dr.left := dx; dr.top := dr.bottom-dh; dr.right := dr.left+dw;
- sPr := SYS.VAL (Sys.GrafRealPtr, sP);
- dPr := SYS.VAL (Sys.GrafRealPtr, dP);
- port := SYS.VAL (Sys.GrafRealPtr, QD.thePort);
- Sys.PenPat(QD.black);
- Sys.CopyBits(sPr.portBits, dPr.portBits, sr, dr, port.pnMode, 0)
- END CopyBlock;
- PROCEDURE ReplPattern* (pat: LONGINT; x, y, w, h: INTEGER);
- VAR p: PatMapPtr; r: Sys.Rect;
- BEGIN
- IF (pat # 0) & ~ODD(pat) THEN p := SYS.VAL(PatMapPtr, pat);
- r.bottom := y; r.left := x; r.top := r.bottom-h; r.right := r.left+w; Sys.PenPat(p.pattern); Sys.PaintRect(r)
- END
- END ReplPattern;
- PROCEDURE FillPattern* (pat: LONGINT; px, py, x, y, w, h: INTEGER);
- VAR p: PatMapPtr; r: Sys.Rect;
- BEGIN
- IF (pat # 0) & ~ODD(pat) THEN p := SYS.VAL(PatMapPtr, pat);
- r.bottom := y; r.left := x; r.top := r.bottom-h; r.right := r.left+w; Sys.PenPat(p.pattern); Sys.PaintRect(r)
- END
- END FillPattern;
- PROCEDURE ReplConst* (x, y, w, h: INTEGER);
- VAR r: Sys.Rect;
- BEGIN r.bottom := y; r.left := x; r.top := r.bottom-h; r.right := r.left+w; Sys.PenPat(QD.black); Sys.PaintRect(r)
- END ReplConst;
- PROCEDURE Dot* (x, y: INTEGER);
- BEGIN Sys.PenPat(QD.black); Sys.MoveTo(x, y); Sys.Lin(0, 0)
- END Dot;
- PROCEDURE Line* (x0, y0, x1, y1: INTEGER);
- BEGIN Sys.PenPat(QD.black); Sys.MoveTo(x0, y0); Sys.LineTo(x1, y1)
- END Line;
- PROCEDURE Circle* (x, y, r: INTEGER);
- VAR rec: Sys.Rect;
- BEGIN rec.bottom := y+r; rec.top := rec.bottom-2*r-1; rec.left := x-r; rec.right := x+r+1; Sys.PenPat(QD.black); Sys.FrameOval(rec)
- END Circle;
- PROCEDURE Ellipse* (x, y, a, b: INTEGER);
- VAR rec: Sys.Rect;
- BEGIN rec.bottom := y+b; rec.top := rec.bottom-2*b-1; rec.left := x-a; rec.right := x+a+1; Sys.PenPat(QD.black); Sys.FrameOval(rec)
- END Ellipse;
- PROCEDURE ContString* (f: FontMapPtr; VAR s: ARRAY OF CHAR);
- VAR len: INTEGER; port: Sys.GrafRealPtr; fnt: FontMapRealPtr;
- BEGIN len := 0; port := SYS.VAL (Sys.GrafRealPtr, QD.thePort); fnt:=SYS.VAL (FontMapRealPtr, f);
- WHILE s[len] # 0X DO INC(len) END;
- IF port.txMode # port.pnMode THEN Sys.TextMode(port.pnMode) END;
- IF f # ppf THEN Sys.TextFont(fnt.fntNum); Sys.TextFace(fnt.fntFace); Sys.TextSize(fnt.fntSize); ppf := f END;
- Sys.DrawText(SYS.ADR(s), 0, len)
- END ContString;
- PROCEDURE String* (f: FontMapPtr; x, y: INTEGER; VAR s: ARRAY OF CHAR);
- VAR fnt: FontMapRealPtr;
- BEGIN fnt:=SYS.VAL (FontMapRealPtr, f); Sys.MoveTo(x, y+fnt.ndescent); ContString(f, s)
- END String;
- (* Colors *)
- PROCEDURE EnterColor (col, red, green, blue: INTEGER);
- BEGIN redP[col] := red; greenP[col] := green; blueP[col] := blue
- END EnterColor;
- PROCEDURE SetColor* (col, red, green, blue: INTEGER);
- VAR rgb: Sys.RGBColor;
- BEGIN
- IF (col > 3) & (col # 15) THEN EnterColor(col, red, green, blue) END;
- rgb.red := red*101H; rgb.green := green*101H; rgb.blue := blue*101H;
- Sys.AnimateEntry(thePortPtr, col+2, rgb)
- END SetColor;
- PROCEDURE GetColor* (col: INTEGER; VAR red, green, blue: INTEGER);
- BEGIN red := redP[col]; green := greenP[col]; blue := blueP[col]
- END GetColor;
- PROCEDURE SetUserClip* (x, y, w, h: INTEGER);
- BEGIN FlushCache; Sys.SetRectRgn(userClip, x, y-h, x+w, y)
- END SetUserClip;
- (* Pictures *)
- PROCEDURE Open* (P: Sys.GrafPtr; width, height: INTEGER);
- VAR port: Sys.GrafRealPtr;
- BEGIN port := SYS.VAL (Sys.GrafRealPtr, P);
- Sys.OpenPort(port^); port.portBits.rowBytes := ((width+31) DIV 32)*4;
- Sys.AllocBlock(port.portBits.baseAddr, LONG(port.portBits.rowBytes)*LONG(height));
- port.portBits.bounds.top := 0; port.portBits.bounds.bottom := height; port.portBits.bounds.left := 0;
- port.portBits.bounds.right := width;
- port.portRect := port.portBits.bounds; Sys.RectRgn(port.visRgn, port.portBits.bounds)
- END Open;
- PROCEDURE Close* (P: Sys.GrafPtr);
- VAR port: Sys.GrafRealPtr;
- BEGIN port := SYS.VAL (Sys.GrafRealPtr, P);
- Sys.DeAllocBlock(port.portBits.baseAddr); port.portBits.baseAddr := 0
- END Close;
- (* Patterns *)
- PROCEDURE NewPatMap* (VAR image: ARRAY OF SET; width, height, offset: INTEGER): PatMapPtr;
- VAR p: PatMapPtr; row, byte: INTEGER; src, dest, data: LONGINT; pat: Longword;
- BEGIN NEW(p); p.bounds.bottom := height; p.bounds.right := width;
- p.rowBytes := ((width+31) DIV 32)*4; Sys.AllocBlock(p.baseAddr, p.rowBytes*height); p.link := patMaps; patMaps := p;
- src := SYS.ADR(image[offset]); dest := p.baseAddr+p.rowBytes* (height-1);
- FOR row := 0 TO height-1 DO
- FOR byte := 0 TO p.rowBytes-1 BY 4 DO
- SYS.GET(src, data); pat := SYS.VAL(Longword, data); INC(src, 4);
- SYS.PUT(dest, inverse[ORD(pat[3])]); INC(dest); SYS.PUT(dest, inverse[ORD(pat[2])]); INC(dest);
- SYS.PUT(dest, inverse[ORD(pat[1])]); INC(dest); SYS.PUT(dest, inverse[ORD(pat[0])]); INC(dest)
- END;
- dest := dest-2*p.rowBytes
- END;
- dest := SYS.ADR(p.pattern)+7;
- FOR row := 0 TO 7 DO
- src := SYS.ADR(image[offset])+p.rowBytes* ((thePortH+row) MOD height);
- SYS.GET(src, data); pat := SYS.VAL(Longword, data); SYS.PUT(dest, inverse[ORD(pat[3])]); DEC(dest)
- END;
- RETURN p
- END NewPatMap;
- PROCEDURE GetPatSize* (pat: LONGINT; VAR w, h: INTEGER);
- VAR p: PatMapPtr; fontInfo: Sys.FontInfo;
- BEGIN
- IF ODD(pat) THEN FlushCache;
- IF QD.thePort # shadowPortPtr THEN Sys.SetPort(shadowPort) END;
- Sys.TextFont(SHORT((pat DIV 1000000H) MOD 100H)); Sys.TextFace(SHORT((pat DIV 2) MOD 4));
- Sys.TextSize(SHORT((pat DIV 10000H) MOD 100H)); spf := 0;
- Sys.GetFontInf(fontInfo); h := fontInfo.ascent+fontInfo.descent; w := Sys.CharWidth(SHORT((pat DIV 100H) MOD 100H))
- ELSE p := SYS.VAL(PatMapPtr, pat); w := p.bounds.right; h := p.bounds.bottom
- END
- END GetPatSize;
- (* Fonts *)
- PROCEDURE GetFontInfo* (VAR fname: ARRAY OF CHAR; VAR fntNum, fntSize, fntFace: INTEGER);
- VAR i: INTEGER; ch, styl: CHAR; str: Sys.Str255;
- BEGIN i := 0; ch := fname[0];
- WHILE (ch # ".") & (ch # 0X) & ((ch < "0") OR (ch > "9")) & (i < 24) DO INC(i); str[i] := ch; ch := fname[i] END;
- IF i = 0 THEN fntNum := 0
- ELSE str[0] := CHR(i); Sys.GetFNum(str, fntNum);
- IF fntNum=osyntaxFnt THEN fntNum := syntaxFnt END;
- fntSize := 0;
- WHILE (fname[i] >= "0") & (fname[i] <= "9") & (i < 24) DO fntSize := 10 * fntSize + ORD(fname[i]) - ORD("0"); INC(i) END;
- IF fntSize = 0 THEN fntSize := 24 END;
- styl := CAP(fname[i]);
- IF styl="B" THEN fntFace := 1
- ELSIF styl="I" THEN fntFace := 2
- ELSIF styl="M" THEN fntFace := 3
- ELSE fntFace := 0
- END;
- END
- END GetFontInfo;
- PROCEDURE GetFontName* (fntNum, fntSize, fntFace: INTEGER; VAR fname: ARRAY OF CHAR);
- VAR ch: CHAR; str: Sys.Str255; i, k, m: INTEGER;
- BEGIN
- IF fntSize = 0 THEN COPY(defaultFontName, fname)
- ELSE
- IF fntNum = syntaxFnt THEN fntNum := osyntaxFnt END;
- Sys.GetFontNam(fntNum, str);
- i := ORD(str[0]);
- WHILE i > 0 DO ch := str[i]; DEC(i); fname[i] := ch END;
- i := ORD(str[0]);
- IF fntSize > 1 THEN m := 1;
- WHILE m <= fntSize DO m := m*10 END;
- WHILE m > 1 DO m := m DIV 10; k := fntSize DIV m; fname[i] := CHR(k+ORD("0")); INC(i); DEC(fntSize, k*m) END
- END;
- IF fntFace = 1 THEN fname[i] := "b"; INC(i)
- ELSIF fntFace = 2 THEN fname[i] := "i"; INC(i)
- ELSIF fntFace = 3 THEN fname[i] := "m"; INC(i)
- END;
- fname[i] := "."; INC(i); fname[i] := "S"; INC(i); fname[i] := "c"; INC(i); fname[i] := "n"; INC(i);
- fname[i] := "."; INC(i); fname[i] := "F"; INC(i); fname[i] := "n"; INC(i); fname[i] := "t"; INC(i); fname[i] := 0X
- END
- END GetFontName;
- PROCEDURE NewFontMap* (fntNum, fntSize, fntFace: INTEGER): FontMapPtr;
- VAR map: FontMapRealPtr; i: INTEGER; fontInfo: Sys.FontInfo;
- BEGIN FlushCache;
- IF QD.thePort # shadowPortPtr THEN Sys.SetPort(shadowPort) END;
- Sys.TextFont(fntNum); Sys.TextSize(fntSize); Sys.TextFace(fntFace); spf := 0; Sys.GetFontInf(fontInfo); NEW(map);
- map.fntNum := fntNum; map.fntSize := fntSize; map.fntFace := fntFace;
- map.height := fontInfo.ascent + fontInfo.descent; map.widMax := fontInfo.widMax;
- map.ascent := fontInfo.ascent; map.ndescent := - fontInfo.descent;
- map.fCode := (fntNum MOD 100H) * 1000000H + (fntSize MOD 100H) * 10000H
- + ((-fontInfo.descent) * 2*4) MOD 100H + (fntFace MOD 4) * 2 + 1;
- FOR i := 0 TO 255 DO map.width[i] := Sys.CharWidth(i) END;
- RETURN SYS.VAL (FontMapPtr, map)
- END NewFontMap;
- PROCEDURE ConvertChar (VAR ch: CHAR); (* convert Oberon umlauts to Macintosh *)
- BEGIN
- CASE ORD(ch) OF
- 131: ch := CHR (138)
- | 132: ch := CHR (154)
- | 133: ch := CHR (159)
- (* | 128: ch := CHR (128) *)
- | 129: ch := CHR (133)
- | 130: ch := CHR (134)
- ELSE
- END
- END ConvertChar;
- PROCEDURE GetChar* (f: LONGINT; ch: CHAR; VAR dx, x, y, w, h: INTEGER; VAR p: LONGINT);
- VAR i: INTEGER; fnt: FontMapRealPtr;
- BEGIN
- fnt:=SYS.VAL (FontMapRealPtr, f);
- IF (ORD (ch) >= 128) & ((~bitmapSyntax) OR (fnt.fntNum#syntaxFnt)) THEN ConvertChar (ch) END;
- SYS.GET(f, SYS.VAL(LONGINT, ccp)); ccp[2] := ch; p := SYS.VAL(LONGINT, ccp);
- ccf := SYS.VAL(FontMapPtr, f); SYS.GET(f + 4 + ORD(ch) * 2, i);
- IF i = 0 THEN h := 0 ELSE h := fnt.height END;
- w := i; dx := i; ccdx := i; x := 0; y := fnt.ndescent
- END GetChar;
- (* Splines *)
- PROCEDURE SolveTriDiag (VAR a, b, c, y: RealVector; n: INTEGER);
- VAR i: INTEGER;
- BEGIN i := 1; (*a, b, c of tri-diag matrix T; solve Ty'=y for y', assign y' to y*)
- WHILE i < n DO y[i] := y[i]-c[i-1]*y[i-1]; INC(i) END;
- i := n-1; y[i] := y[i]/a[i];
- WHILE i > 0 DO DEC(i); y[i] := (y[i]-b[i]*y[i+1])/a[i] END
- END SolveTriDiag;
- PROCEDURE OpenSpline* (VAR x, y, d: RealVector; n: INTEGER);
- VAR i: INTEGER; d1, d2: REAL; a, b, c: RealVector;
- BEGIN b[0] := 1.0/(x[1]-x[0]); a[0] := 2.0*b[0]; c[0] := b[0]; d1 := (y[1]-y[0])*3.0*b[0]*b[0]; d[0] := d1; i := 1; (*from x, y compute d=y'*)
- WHILE i < n-1 DO
- b[i] := 1.0/(x[i+1]-x[i]); a[i] := 2.0* (c[i-1]+b[i]); c[i] := b[i];
- d2 := (y[i+1]-y[i])*3.0*b[i]*b[i]; d[i] := d1+d2; d1 := d2; INC(i)
- END;
- a[i] := 2.0*b[i-1]; d[i] := d1; i := 0;
- WHILE i < n-1 DO c[i] := c[i]/a[i]; a[i+1] := a[i+1]-c[i]*b[i]; INC(i) END;
- SolveTriDiag(a, b, c, d, n)
- END OpenSpline;
- PROCEDURE ClosedSpline* (VAR x, y, d: RealVector; n: INTEGER);
- VAR i: INTEGER; d1, d2, hn, dn: REAL; a, b, c, w: RealVector;
- BEGIN hn := 1.0/(x[n-1]-x[n-2]); dn := (y[n-1]-y[n-2])*3.0*hn*hn; (*from x, y compute d=y'*)
- b[0] := 1.0/(x[1]-x[0]); a[0] := 2.0*b[0]+hn; c[0] := b[0]; d1 := (y[1]-y[0])*3.0*b[0]*b[0]; d[0] := dn+d1; w[0] := 1.0; i := 1;
- WHILE i < n-2 DO
- b[i] := 1.0/(x[i+1]-x[i]); a[i] := 2.0* (c[i-1]+b[i]); c[i] := b[i];
- d2 := (y[i+1]-y[i])*3.0*b[i]*b[i]; d[i] := d1+d2; d1 := d2; w[i] := 0; INC(i)
- END ;
- a[i] := 2.0*b[i-1]+hn; d[i] := d1+dn; w[i] := 1.0; i := 0;
- WHILE i < n-2 DO c[i] := c[i]/a[i]; a[i+1] := a[i+1]-c[i]*b[i]; INC(i) END;
- SolveTriDiag(a, b, c, d, n-1); SolveTriDiag(a, b, c, w, n-1);
- d1 := (d[0]+d[i])/(w[0]+w[i]+x[i+1]-x[i]); i := 0;
- WHILE i < n-1 DO d[i] := d[i]-d1*w[i]; INC(i) END;
- d[i] := d[0]
- END ClosedSpline;
- (* Clipboard *)
- PROCEDURE GetScrap*;
- VAR h : Sys.TERealHandle;
- BEGIN h := SYS.VAL (Sys.TERealHandle, scrap);
- Sys.TEStylPaste(scrap); style := Sys.TEGetStylHandle(scrap); max := h.p.teLength;
- textHandle := h.p.teHandle; Sys.HLock(textHandle); SYS.GET(textHandle, text); pos := 0
- END GetScrap;
- PROCEDURE GetRun* (VAR run: ARRAY OF CHAR; VAR len: INTEGER; VAR fname: ARRAY OF CHAR);
- VAR l, f, rn, end: INTEGER; txStyl: Sys.TextStyle; s: Sys.TEStyleRealHandle; h : Sys.TERealHandle;
- BEGIN
- s := SYS.VAL (Sys.TEStyleRealHandle, style);
- h := SYS.VAL (Sys.TERealHandle, scrap);
- IF pos < max THEN
- IF s # NIL THEN
- Sys.TEGetStyle(pos, txStyl, l, f, scrap);
- GetFontName(txStyl.tsFont, txStyl.tsSize, txStyl.tsFace DIV 100H, fname);
- rn := 0;
- WHILE s.p.runs[rn].startChar <= pos DO INC(rn) END;
- end := s.p.runs[rn].startChar;
- IF end > max THEN end := max END
- ELSE COPY(defaultFontName, fname); end := h.p.teLength
- END;
- len := end-pos;
- IF len > LEN(run) THEN len := SHORT(LEN(run)) END;
- SYS.MOVE(text+pos, SYS.ADR(run), len);
- INC(pos, len)
- ELSE len := 0; Sys.HUnlock(textHandle); Sys.TESetSelect(0, h.p.teLength, scrap); Sys.TEDelete(scrap)
- END
- END GetRun;
- PROCEDURE PutRun* (VAR run: ARRAY OF CHAR; len: INTEGER; VAR fname: ARRAY OF CHAR);
- VAR txStyl: Sys.TextStyle; h : Sys.TERealHandle;
- BEGIN h := SYS.VAL (Sys.TERealHandle, scrap);
- GetFontInfo(fname, txStyl.tsFont, txStyl.tsSize, txStyl.tsFace);
- Sys.TESetSelect(h.p.teLength, h.p.teLength, scrap); Sys.TEInsert(SYS.ADR(run), len, scrap);
- Sys.TESetSelect(h.p.teLength-len, h.p.teLength, scrap); Sys.TESetStyle(7, txStyl, TRUE, scrap)
- END PutRun;
- PROCEDURE PutScrap*;
- VAR h : Sys.TERealHandle;
- BEGIN h := SYS.VAL (Sys.TERealHandle, scrap); Sys.TESetSelect(0, h.p.teLength, scrap); Sys.TECut(scrap)
- END PutScrap;
- (* Environment *)
- PROCEDURE AboutOberon*;
- VAR itemHit: INTEGER;
- BEGIN itemHit := Sys.Alert(32767, 0)
- END AboutOberon;
- PROCEDURE GetPar* (parName: ARRAY OF CHAR; VAR thePar: ARRAY OF CHAR);
- VAR resName: Sys.Str255; resHandle: LONGINT; resPtr: POINTER TO ARRAY 256 OF CHAR;
- BEGIN
- SetStr255(resName, parName);
- resHandle := Sys.GetNamedResource(Sys.ApplSig, resName);
- IF resHandle = 0 THEN thePar[0] := 0X
- ELSE Sys.HLock(resHandle); SYS.GET(resHandle, resPtr); COPY(resPtr^, thePar); Sys.HUnlock(resHandle)
- END
- END GetPar;
- (* Events *)
- PROCEDURE MenuCommand (menuResult: MenuEventMsg);
- VAR res: INTEGER; daName: Sys.Str255;
- BEGIN
- IF menuResult.id # noMenu THEN
- Sys.GetItem(Sys.GetMHandle(menuResult.id), menuResult.item, daName);
- GetStr255(daName, cmdName); cmdQ.Handle();
- IF qRes # 0 THEN res := Sys.OpenDeskAcc(daName) END;
- Sys.HiliteMenu(noMenu)
- END
- END MenuCommand;
- PROCEDURE BufferKey (msg: KeyEventMsg; cntrlKeyDown: BOOLEAN);
- BEGIN
- IF cntrlKeyDown & (msg.ascii < 20X) THEN
- keybuf[nofch] := msg.ascii
- ELSIF msg.ascii=10X THEN
- CASE msg.virtual OF
- | 7AX: keybuf[nofch] := 0F1X (* F1 *)
- | 78X: keybuf[nofch] := 0F2X (* F2 *)
- | 63X: keybuf[nofch] := 0F3X (* F3 *)
- | 76X: keybuf[nofch] := 0F4X (* F4 *)
- ELSE END
- ELSIF msg.ascii=1BX THEN
- IF msg.virtual=47X THEN keybuf[nofch] := 0AX ELSE keybuf[nofch] := 1BX END (*ESC, NumLock => LF *)
- ELSIF msg.ascii=7FX THEN
- IF msg.virtual=75X THEN keybuf[nofch] := 08X ELSE keybuf[nofch] := 7FX END (*DEL, del right => BS *)
- ELSE keybuf[nofch] := keytrans[ORD(msg.ascii)]
- END;
- INC(nofch)
- END BufferKey;
- PROCEDURE ScanEvents; (* Get all pending Keyboard Events / Handle non-Oberon Macintosh Events *)
- CONST sleepTicks=0;
- inDesk=0; inMenuBar=1; inSysWindow=2; inContent=3; inDrag=4; inGoAway=6; inZoomIn=7; inZoomOut=8;
- nullEvent=0; mouseDown=1; mouseUp=2; keyDown=3; keyUp=4; autoKey=5; updateEvt=6;
- diskEvt=7; activateEvt=8; networkEvt=10; app3Evt=14; osEvt=15; everyEvent=-1;
- VAR gotEvent: BOOLEAN; event: Sys.EventRecord; eventWindow: Sys.WindowPtr; m:MenuEventMsg;
- BEGIN
- nofch := 0; nextch := 0; macEvent := FALSE;
- LOOP
- Sys.SetCurs(obnArrow);
- gotEvent := Sys.WaitNextEvent(everyEvent, event, 0, 0);
- CASE event.what OF
- | mouseDown:
- macEvent := TRUE;
- CASE Sys.FindWindow(SYS.VAL(LONGINT, event.where), eventWindow) OF
- | inDesk, inZoomIn, inZoomOut:
- | inMenuBar: m := SYS.VAL(MenuEventMsg, Sys.MenuSelect(SYS.VAL(LONGINT, event.where))); MenuCommand(m)
- | inSysWindow: Sys.SystemClick(event, eventWindow)
- | inContent: Sys.SelectWindow1(eventWindow)
- | inDrag: Sys.DragWindow(eventWindow, SYS.VAL(LONGINT, event.where), grafArea)
- | inGoAway: IF eventWindow=thePortPtr THEN HideOberonWindow ELSE Sys.CloseWindow(thePortPtr) END
- END
- | keyDown:
- IF Sys.FrontWindow()=thePortPtr THEN
- IF 23 IN SYS.VAL(SET, LONG(event.modifiers)) THEN
- m := SYS.VAL(MenuEventMsg, Sys.MenuKey(SHORT(event.message MOD 100H)));
- MenuCommand (m);
- ELSE BufferKey(SYS.VAL(KeyEventMsg, event.message), ODD(event.modifiers DIV 4096));
- RETURN
- END
- END
- | autoKey:
- IF Sys.FrontWindow()=thePortPtr THEN
- BufferKey(SYS.VAL(KeyEventMsg, event.message), ODD(event.modifiers DIV 4096));
- RETURN
- END
- | updateEvt:
- IF SYS.VAL(Sys.WindowPtr, event.message)=thePortPtr THEN UpdateOberonWindow
- ELSE Sys.BeginUpdate1(event.message); Sys.EndUpdate1(event.message)
- END
- | activateEvt:
- IF (SYS.VAL(Sys.WindowPtr, event.message)=thePortPtr) & ODD(event.modifiers) THEN Sys.SetPort(thePort) END;
- | osEvt:
- macEvent := TRUE;
- IF ~ODD(event.message) THEN
- convertClip:=ODD(event.message DIV 2);
- suspendQ.Handle();
- LOOP gotEvent := Sys.WaitNextEvent(everyEvent, event, 0, 0);
- IF event.what=updateEvt THEN
- IF SYS.VAL(Sys.WindowPtr, event.message)=thePortPtr THEN UpdateOberonWindow
- ELSE Sys.BeginUpdate1(event.message); Sys.EndUpdate1(event.message)
- END
- ELSIF (event.what=osEvt) & ODD(event.message) THEN EXIT
- ELSE backgroundQ.Handle()
- END
- END;
- convertClip:=ODD(event.message DIV 2); resumeQ.Handle(); Sys.HiliteMenu(noMenu)
- END
- | nullEvent, mouseUp, keyUp, diskEvt, networkEvt..app3Evt: RETURN
- ELSE RETURN
- END
- END
- END ScanEvents;
- PROCEDURE Available* (): INTEGER;
- BEGIN IF nextch < nofch THEN RETURN nofch-nextch ELSE ScanEvents; RETURN nofch END
- END Available;
- PROCEDURE Read* (VAR ch: CHAR);
- BEGIN REPEAT UNTIL Available() > 0; ch := keybuf[nextch]; INC(nextch)
- END Read;
- PROCEDURE Mouse* (VAR keys: SET; VAR x, y: INTEGER); (* Mouse Coordinates local to Display Window *)
- VAR p: Sys.Point; map: Sys.KeyMap;
- BEGIN FlushCache;
- IF SYS.VAL (LONGINT, QD.thePort) # SYS.VAL (LONGINT, thePortPtr) THEN Sys.SetPort(thePort) END;
- Sys.GetMouse(p);
- IF p.h <= 0 THEN x := 0 ELSIF p.h > xlim THEN x := xlim ELSE x := p.h END;
- IF p.v <= 0 THEN y := ylim ELSIF p.v > ylim THEN y := 0 ELSE y := ylim-p.v END;
- Sys.GetKeys(map);
- IF 28 IN map[1] THEN keys := {1} ELSE keys := {} END; (* Control Key Down *)
- IF 29 IN map[1] THEN INCL(keys, 0) END; (* Option Key Down *)
- IF Sys.Button() THEN INCL(keys, 2) END (* Mouse Button Pressed *)
- END Mouse;
- PROCEDURE SetMouseLimits* (w, h: INTEGER);
- BEGIN xlim := w-1; ylim := h-1
- END SetMouseLimits;
- (* keyboard interrupt *)
- PROCEDURE Suspended;
- BEGIN suspended:=TRUE END Suspended;
- PROCEDURE Resumed;
- BEGIN suspended:=FALSE END Resumed;
- PROCEDURE Retrace (t : LONGINT);
- VAR kmap : SET; pc, sp, sp1, sp2: LONGINT;
- BEGIN
- vblTask.vblCount := 6;
- IF ~suspended THEN
- SYS.GET (178H, kmap);
- IF kmap * {8, 16} = {8, 16} THEN
- IF ~pressed THEN
- pressed := TRUE;
- SYS.GETREG (1, sp); SYS.GET (sp, sp); SYS.GET (sp, sp); sp := sp + 335;
- SYS.GET (sp, pc);
- (* sp1 := sp + 444; sp2 := sp + 440; SYS.GET (sp1, pc1); SYS.GET (sp2, pc2); IF pc1 = 0 THEN pc := pc2 ELSE pc := pc1 END; *)
- IF (pc > Kernel.heapBeg) & (pc < Kernel.heapEnd) THEN
- IF kbdIntPC # 0 THEN SYS.PUT (kbdIntPC, kbdIntInstr) END;
- kbdIntPC := pc;
- SYS.GET (pc, kbdIntInstr);
- SYS.PUT (pc, 7FE00008H) (* patch with twi instruction *)
- END
- END
- ELSE pressed := FALSE
- END
- END
- END Retrace;
- (* Initialization *)
- PROCEDURE InitBitTrans;
- VAR i, bits, flip, r: LONGINT;
- BEGIN i := 255;
- WHILE i > 0 DO bits := i; flip := 0; r := 80H;
- WHILE bits # 0 DO
- IF ODD(bits) THEN INC(flip, r) END;
- r := SYS.LSH(r,-1); bits := SYS.LSH(bits,-1)
- END;
- inverse[i] := CHR(flip); DEC(i)
- END
- END InitBitTrans;
- PROCEDURE InitKeyTrans;
- VAR i: INTEGER;
- BEGIN
- FOR i := 0 TO 255 DO keytrans[i] := CHR(i) END;
- keytrans[3H] := 0A4X; (*Enter->SETUP*) keytrans[8H] := 7FX; (*BS -> DEL*);
- keytrans[01H] := 091X; (*home -> NSCR*) keytrans[04H] := 093X; (*end -> SHNSCR*)
- keytrans[0BH] := 0ACX; (*pgup -> BRK*) keytrans[0CH] := 0ADX; (*pgdown -> SHBRK*)
- keytrans[1CH] := 0C4X; (*left*) keytrans[1DH] := 0C3X; (*right*)
- keytrans[1EH] := 0C1X; (*up*) keytrans[1FH] := 0C2X; (*down*)
- keytrans[80H] := 80X; (*Ae*) keytrans[85H] := 81X; (*Oe*) keytrans[86H] := 82X; (*Ue*)
- keytrans[8AH] := 83X; (*ae*) keytrans[9AH] := 84X; (*oe*) keytrans[9FH] := 85X; (*ue*)
- keytrans[89H] := 86X; (*a circonflex*) keytrans[90H] := 87X; (*e circonflex*) keytrans[94H] := 88X; (*i circonflex*)
- keytrans[99H] := 89X; (*o circonflex*) keytrans[9EH] := 8AX; (*u circonflex*)
- keytrans[88H] := 8BX; (*a grave*) keytrans[8FH] := 8CX; (*e grave*) keytrans[93H] := 8DX; (*i grave*)
- keytrans[97H] := 8EX; (*o grave*) keytrans[9DH] := 8FX; (*u grave*)
- keytrans[8EH] := 90X; (*e aigue*) keytrans[91H] := 91X; (*e dieresis*) keytrans[95H] := 92X; (*i dieresis*)
- keytrans[8DH] := 93X; (*c cedille*) keytrans[87H] := 94X; (*a aigue*) keytrans[96H] := 95X; (*n tilde*)
- END InitKeyTrans;
- PROCEDURE InitMenuBar;
- BEGIN
- Sys.ClearMenuBar; obnMenus := Sys.GetNewMBar(32767);
- Sys.AddResMenu(Sys.GetMenu(32767), 44525652H); Sys.SetMenuBar(obnMenus); Sys.DrawMenuBar;
- END InitMenuBar;
- PROCEDURE InitArrow;
- BEGIN
- obnArrow.data[0] := {17..24}; obnArrow.data[1] := {1..7, 17..22};
- obnArrow.data[2] := {1..5, 17..22}; obnArrow.data[3] := {1..3, 5..7, 17..18, 22..24};
- obnArrow.data[4] := {1, 7..9, 24..26}; obnArrow.data[5] := {9..11, 26..28};
- obnArrow.data[6] := {11..13, 28..30}; obnArrow.data[7] := {13};
- obnArrow.mask[0] := {0..9, 16..25}; obnArrow.mask[1] := {0..8, 16..23};
- obnArrow.mask[2] := {0..6, 16..23}; obnArrow.mask[3] := {0..8, 16..19, 21..25};
- obnArrow.mask[4] := {0..2, 6..10, 16..17, 23..27}; obnArrow.mask[5] := {8..12, 25..29};
- obnArrow.mask[6] := {10..14, 27..31}; obnArrow.mask[7] := {12..14, 29};
- (* obnArrow.data[0] := {7..14}; obnArrow.data[1] := {24..30, 9..14};
- obnArrow.data[2] := {26..30, 9..14}; obnArrow.data[3] := {28..30, 24..26, 13..14, 7..9};
- obnArrow.data[4] := {30, 22..24, 5..7}; obnArrow.data[5] := {20..22, 3..5};
- obnArrow.data[6] := {18..20, 1..3}; obnArrow.data[7] := {18};
- obnArrow.mask[0] := {22..31, 6..15}; obnArrow.mask[1] := {23..31, 8..15};
- obnArrow.mask[2] := {25..31, 8..15}; obnArrow.mask[3] := {23..31, 12..15, 6..10};
- obnArrow.mask[4] := {29..31, 21..25, 14..15, 4..8}; obnArrow.mask[5] := {19..23, 2..6};
- obnArrow.mask[6] := {17..21, 0..4}; obnArrow.mask[7] := {17..19, 2}; *)
- obnArrow.hotSpot.v := 1; obnArrow.hotSpot.h := 1
- END InitArrow;
- PROCEDURE InitWindow;
- VAR bounds: Sys.Rect; titlStr: Sys.Str255; mBarH: INTEGER;
- BEGIN
- SetStr255(titlStr, "Oberon for PowerMac - University of Linz");
- bounds := QD.screenBits.bounds;
- mBarH := Sys.GetMBarHeight(); INC(bounds.top, mBarH);
- thePortPtr := Sys.NewCWindow(thePort, bounds, titlStr, TRUE, 4, -1, FALSE, 4D534F46H);
- thePortW := thePort.portRect.right-thePort.portRect.left;
- thePortH := thePort.portRect.bottom-thePort.portRect.top;
- Sys.OpenPort(shadowPort);
- shadowPortPtr := SYS.VAL(Sys.GrafPtr, SYS.ADR(shadowPort));
- shadowPort.portBits.rowBytes := ((thePortW+31) DIV 32)*4;
- IF thePortH < 1024 THEN shadowH := 1024 ELSE shadowH := thePortH END;
- Sys.AllocBlock(shadowPort.portBits.baseAddr, LONG(shadowPort.portBits.rowBytes)*LONG(shadowH));
- shadowPort.portBits.bounds.top := thePortH;
- shadowPort.portBits.bounds.bottom := thePortH+shadowH;
- shadowPort.portBits.bounds.left := 0;
- shadowPort.portBits.bounds.right := thePortW;
- shadowPort.portRect := shadowPort.portBits.bounds;
- Sys.RectRgn(shadowPort.visRgn, shadowPort.portBits.bounds);
- Sys.SetPort(thePort); Sys.BeginUpdate(thePort); Sys.EndUpdate(thePort);
- END InitWindow;
- PROCEDURE InitScrap;
- VAR r: Sys.Rect;
- BEGIN
- r.top := 0; r.left := -thePortW; r.bottom := thePortH; r.right := 0;
- scrap := Sys.TEStylNew(r, r)
- END InitScrap;
- PROCEDURE InitFontTrans;
- VAR str: Sys.Str255; name: ARRAY 256 OF CHAR;
- BEGIN
- GetPar("Fonts.DefaultFontName", defaultFontName);
- GetPar("Macintosh.SyntaxFontName", name);
- IF name = "automatic" THEN
- IF thePortW < 1024 THEN name := "SyntaxR" ELSE name := "SyntaxO" END
- END;
- SetStr255(str, name); Sys.GetFNum(str, syntaxFnt);
- SetStr255(str, "Syntax"); Sys.GetFNum(str, osyntaxFnt);
- SetStr255(str, "Helvetica"); Sys.GetFNum(str, helveticFnt);
- IF osyntaxFnt # 0 THEN helveticFnt := osyntaxFnt; syntaxFnt := osyntaxFnt END;
- bitmapSyntax := syntaxFnt # helveticFnt
- END InitFontTrans;
- PROCEDURE InitPort;
- BEGIN
- lineBuf := SYS.ADR(line);
- grafArea.left := MIN(INTEGER); grafArea.right := MAX(INTEGER); grafArea.top := MIN(INTEGER); grafArea.bottom := MAX(INTEGER);
- tpc := -1; spc := -1;
- userClip := Sys.NewRgn(); thePortClip := Sys.NewRgn();
- Sys.SetRectRgn(userClip, thePort.portRect.left, thePort.portRect.top, shadowPort.portRect.right, shadowPort.portRect.bottom);
- Sys.SetRectRgn(thePortClip, thePort.portRect.left, thePort.portRect.top, shadowPort.portRect.right, shadowPort.portRect.bottom)
- END InitPort;
- PROCEDURE InitPalette;
- VAR err, val, adr: LONGINT; res: SET;
- BEGIN
- adr := SYS.ADR (val);
- SYS.PUT (adr, 'q');
- SYS.PUT (adr + 1, 'd');
- SYS.PUT (adr + 2, 'r');
- SYS.PUT (adr + 3, 'w');
- err := Gestalt (val, SYS.VAL (LONGINT, res));
- trueColor := 27 IN res;
- EnterColor(0, 255, 255, 255); EnterColor(1, 255, 0, 0); EnterColor(2, 0, 255, 0); EnterColor(3, 0, 0, 255);
- SetColor(4, 255, 0, 255); SetColor(5, 255, 255, 0); SetColor(6, 0, 255, 255); SetColor(7, 170, 0, 0);
- SetColor(8, 0, 153, 0); SetColor(9, 0, 0, 153); SetColor(10, 119, 0, 204); SetColor(11, 187, 136, 0);
- SetColor(12, 180, 180, 180); SetColor(13, 100, 100, 100); SetColor(14, 20, 20, 20); EnterColor(15, 0, 0, 0);
- shadowColor[0] := whiteColor; shadowColor[1] := blackColor; shadowColor[2] := blackColor; shadowColor[3] := blackColor;
- shadowColor[4] := blackColor; shadowColor[5] := blackColor; shadowColor[6] := blackColor; shadowColor[7] := blackColor;
- shadowColor[8] := blackColor; shadowColor[9] := blackColor; shadowColor[10] := blackColor; shadowColor[11] := blackColor;
- shadowColor[12] := blackColor; shadowColor[13] := blackColor; shadowColor[14] := blackColor; shadowColor[15] := blackColor
- END InitPalette;
- PROCEDURE InitKbdInt;
- VAR err, adr: LONGINT;
- BEGIN
- kbdIntPC := 0;
- suspended := FALSE; pressed := FALSE;
- suspendQ.Add (Suspended);
- resumeQ.Add (Resumed);
- NEW (vblTask);
- vblTask.qType:=1;
- vblTask.vblCount:=600;
- vblTask.vblPhase:=0;
- p:=Retrace;
- adr:=SYS.ADR (p);
- vblTask.vblAddr:=SYS.VAL (LONGINT, Sys.NewRoutineDesc (adr, 38914, 1));
- err:=Sys.VInstall (vblTask)
- END InitKbdInt;
- (* Initialize Managers *)
- PROCEDURE InitManagers;
- VAR name : Sys.Str255; h: INTEGER;
- BEGIN
- SetStr255 (name, "Oberon.RSRC"); h := Sys.OpenResFile (name);
- Sys.InitGraf(QD.thePort); Sys.InitFonts; Sys. InitWindows; Sys.InitMenus; Sys.TEInit; Sys.InitDialogs(0); Sys.InitCursor;
- Sys.FlushEvents(0, -1); Sys.SetFScaleDisable(TRUE)
- END InitManagers;
- BEGIN
- Sys.Assign ("RGBForeColor", SYS.ADR (RGBForeColor));
- Sys.Assign ("Gestalt", SYS.ADR (Gestalt));
- InitManagers;
- neutralizeQ.Init(); restoreQ.Init(); suspendQ.Init(); resumeQ.Init(); backgroundQ.Init(); cmdQ.Init();
- InitBitTrans; InitKeyTrans; InitMenuBar; InitArrow; InitWindow; InitScrap; InitFontTrans; InitPort; InitPalette; InitKbdInt
- END Macintosh.
-